<h1>
	JavaScript Augmentations
</h1>


<div id="js-augmentation" class="sect">
	<h2>
		关于JS的加强语法
	</h2>
	<p>
		Javascript是一门灵活的语言。以它灵活性，其中一项表现为，JavaScript基础对象可以让程序员自由地绑定函数在其身上。为什么会这样做？基础对象是与这些所属的方法（函数）有密切联系的，开放给大家定义其关系的。不过这样的方法有许多，不大有可能一一实作出来，有些浏览器有，有些没有，但就开放出来这种修改的权利给程序员。当同时使用多个JavaScript库时，他们可能有各自的实现，但如果同名的方法、属性就犯大忌了，这种重叠将引入库与库之间的冲突……基于这种状况，Ext谨慎处理加入到基础对象的方法数量。这里是一份有关于各框架、库“入侵/污染”问题的调查报告：
		<a href="http://mankz.com/code/GlobalCheck.htm" target=_blank>Framework
			Scanner</A>。
	</p>
</div>

<div id="function-augmentation" class="sect">
	<h2>
		函数
	</h2>
	<p>
		下列函数已经加入了Function的prototoype对象中。（请注意createSequence与createInterceptor
		<b>没有</b>被加入。）：
	<ul>
		<!-- Begin createCallback -->
		<li>
			<b>createCallback</b>
			<div>
				为这个函数创建回调函数，回调函数已经是有一连串的参数定义好的了。当你打算指定一个函数作为回调函数的时候，指明其引用即可，如（如callback:myFn）。然而，当打算给函数传入参数的时候，但却希望其返回的是一个Function类型的，就应使用该方法。因为callback:
				myFn(arg1, arg2)不是返回函数而是该函数的返回值。要返回函数类型，使用createCallback对函数“加壳”，如下例：

				<br />
				<pre>
var sayHello = function(firstName, lastName){
    alert('Hello ' + firstName + ' ' + lastName);
};
Ext.get(<span class="string">'myButton'</span>).on(<span class="string">'click'</span>, sayHello.createCallback(<span
						class="string">'John'</span>, <span class="string">'Smith'</span>);
</pre>
			</div>
		</li>
		<!-- End createCallback -->

		<!-- Begin createDelegate -->
		<li>
			<b>createDelegate</b>
			<div>
				与createCallback有点相似，但略为强大。它不但可允许你指定函数的作用域，而且能够控制送入函数的参数其数目。第一个参数是作用域。第二个参数是送入的参数，可以是多个，也就是参数数组。第三个参数是怎么控制调用者执行时期送入的参数。如果该参数为true，将args加载到该函数的后面，如果该参数为数字类型，则args将插入到所指定的位置。

				<br />
				<br />
				<pre>
var sayHello = function(firstName, lastName, e){
    alert('Hello ' + firstName + ' ' + lastName);
};
Ext.get(<span class="string">'myButton'</span>).on(
   <span class="string">'click'</span>, 
   sayHello.createDelegate(this, [<span class="string">'John'</span>, <span
						class="string">'Smith'</span>], 
   <string class="comment">//0这里说明我们打算把我们参数插入到最前的位置</string>
   0
); 
</pre>
			</div>
		</li>
		<!-- End createDelegate -->

		<!-- Begin defer -->
		<li>
			<b>defer</b>
			<div>
				延迟调用该函数。第一个参数是延迟时间，以毫秒为单位；第二个是作用域的参数。
				<br />
				<br />
				<pre>
var whatsTheTime = function(){
    alert(new Date());
};
whatsTheTime.defer(3000); <span class="comment">//执行之前等待三秒</span>
</pre>
			</div>
		</li>
		<!-- End defer -->

	</ul>
	</p>
</div>

<div id="array-augmentation" class="sect">
	<h2>
		数组
	</h2>
	<p>
		下面的这些方法加入到Array的prototype对象中，浏览器有实现的话就不用加：
		<ul>
			<!-- Begin indexOf -->
			<li>
				<b>indexOf</b>
				<div>
					检查对象是否存在于当前数组中。不存在则返回-1。
					<br />
					<br />
					<pre>
var idx = [1, 2, 3, 4, 5].indexOf(3); <span class="comment">//Returns 2.</span>
</pre>
				</div>
			</li>
			<!-- End indexOf -->

			<!-- Begin remove -->
			<li>
				<b>remove</b>
				<div>
					删除数组中指定对象。如果该对象不在数组中，则不进行操作。注意原数组会发生变化。
					<br />
					<br />
					<pre>
var arr = [1, 2, 3, 4];
arr.remove(2);
var len = arr.length; <span class="comment">// len是3了。</span>
</pre>
				</div>
			</li>
			<!-- End remove -->

		</ul>
	</p>
</div>

<div id="string-augmentation" class="sect">
	<h2>
		字符串
	</h2>
	<p>
		String类只有一个format的方法加入，注意这或者会与Ajax.NET相冲突。
		<ul>
			<!-- Begin format -->
			<li>
				<b>format</b>
				<div>
					定义带标记的字符串，并用传入的字符替换标记。每个标记必须是唯一的，而且必须要像{0},{1}...{n}这样地自增长。

					<br />
					<br />
					<pre>
var s = String.format(
   <span class="string">'Hey {0} {1}'</span>, how are you?', 
   <span class="string">'John'</span>, 
   <span class="string">'Smith'</span>
);
<span class="comment">//{0} 替换为 John, {1} 替换为 Smith.</span>
</pre>
				</div>
			</li>
			<!-- End format -->

		</ul>

	</p>
</div>
